package pingpongdojo.mygames;

import org.eclipse.core.commands.AbstractHandler;
import org.eclipse.core.commands.ExecutionEvent;
import org.eclipse.core.commands.ExecutionException;
import org.eclipse.jface.window.Window;
import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.handlers.HandlerUtil;

import pingpongdojo.model.Game;
import pingpongdojo.model.GameManager.GameListener;
import pingpongdojo.model.ModelFactory;
import pingpongdojo.model.User;
import pingpongdojo.model.UserManager.UserListener;

/**
 * Our sample handler extends AbstractHandler, an IHandler base class.
 * 
 * @see org.eclipse.core.commands.IHandler
 * @see org.eclipse.core.commands.AbstractHandler
 */
public class MyGamesHandler extends AbstractHandler {

	/**
	 * The constructor.
	 */
	public MyGamesHandler() {
	}

	public static void init() {
		ModelFactory.getInstance().getUserManager()
				.addUserListener(new UserListener() {
					@Override
					public void onSetCurrentUser(User user) {
						if (user != null) {
							showDialog(PlatformUI.getWorkbench()
									.getActiveWorkbenchWindow());
						}
					}
				});

		ModelFactory.getInstance().getGameManager()
				.addGameListener(new GameListener() {
					@Override
					public void onSetCurrentGame(Game game) {
						if (game == null
								&& ModelFactory.getInstance().getUserManager()
										.getCurrentUser() != null) {
							// showDialog(PlatformUI.getWorkbench()
							// .getActiveWorkbenchWindow());
						}
					}

					@Override
					public void onGameUpdate(Game game) {
					}
				});
	}

	/**
	 * the command has been executed, so extract extract the needed information
	 * from the application context.
	 */
	public Object execute(ExecutionEvent event) throws ExecutionException {
		IWorkbenchWindow window = HandlerUtil
				.getActiveWorkbenchWindowChecked(event);

		showDialog(window);
		return null;
	}

	public static void showDialog(IWorkbenchWindow window) {
		MyGamesDialog dialog = new MyGamesDialog(window.getShell());
		dialog.create();
		if (dialog.open() == Window.OK) {
			Game game = dialog.getSelectedGame();
			if (game != null) {
				ModelFactory.getInstance().getGameManager()
						.setCurrentGame(game);
			}
		}
	}
}
